package io.sage.ch06.methodrefactoring;

/**
 * 6.6 Split Temporary Variable 分解临时变量
 * 问题场景：程序有某个变量被赋值超过一次，它既不是循环变量，也不被用于收集计算结果
 * 重构思路：针对每次赋值，创立一个独立、对应的临时变量
 * 做法：
 * 1）在待分解临时变量的声明及其第一次被赋值处，修改其名称
 * 2）将新的临时变量生命为final。
 * 3）以该临时变量的第二次赋值动作为界，修改此前对该临时变量的所有引用点，让它们引用新的临时变量。
 * 4）在第二次赋值处，重新声明原先那个临时变量。
 * 5）编译，测试。
 * 6）逐次重复上述过程。每次都在声明处对临时变量改名，并修改下次赋值之前的引用点。
 */
public class SplitTemporaryVariable {

    private double _primaryForce;
    private double _mass;
    private int _delay;
    private double _secondaryForce;

    /**
     * 重构前
     *
     * @param time
     * @return
     */
    double getDistantceTravelled(int time) {
        double result;
        double acc = _primaryForce / _mass;
        int primaryTime = Math.min(time, _delay);
        result = 0.5 * acc * primaryTime * primaryTime;
        int secondaryTime = time - _delay;
        if (secondaryTime > 0) {
            double primaryVel = acc * _delay;
            acc = (_primaryForce + _secondaryForce) / _mass;
            result += primaryVel * secondaryTime + 0.5 * acc * secondaryTime * secondaryTime;
        }
        return result;
    }


    /**
     * 重构后
     */
    double getDistanceTravelled(int time) {
        double result;
        final double primaryAcc = _primaryForce / _mass;
        int primaryTime = Math.min(time, _delay);
        result = 0.5 * primaryAcc * primaryTime * primaryTime;
        int secondaryTime = time - _delay;
        if (secondaryTime > 0) {
            double primaryVel = primaryAcc * _delay;
            final double secondaryAcc = (_primaryForce + _secondaryForce) / _mass;
            result += primaryVel * secondaryTime + 0.5 * secondaryAcc * secondaryTime * secondaryTime;
        }
        return result;
    }
}
